package com.cskaoyan.javase.oop1._17oop;
/**
 * 把大象放进冰箱里
 * 以面向对象的思想编写程序
 * 程序以"对象"为核心
 *
 * 优点：
 *
 * 1.不同的对象功能不同，进而就可以将程序模块化设计、分割，而不再是之前那么一条流水线式编写程序。
 *
 * 2.面向对象思想模块化编程，代码之间的关联会小很多（低耦合）可以实现代码复用，程序可以更好的应对需求变更，程序的扩展性会更好，可维护性会更强。 （最主要、最关键的优点）
 *
 * 3.面向对象思想模块化编程，各个模块之间低耦合，意味着完全可以互相独立进行开发，不需要 完全 互相了解各自模块，更有利于程序员之间的分工协作，降低了开发的难度。
 *
 * 缺点：
 * 1.像Java这种，具有面向对象特性语言编写的程序，内存开销大运行效率低。对象不是凭空产生的，需要时间创建和内存存储。
 * 2.为了对象之间实现相对独立而又能够交互，需要大量的方法去完成这些功能，这会导致程序的代码越来越臃肿。面向对象的程序代码往往都十分庞大。
 *
 * 所以面向对象思想，适合于开发大型的企业级应用（业务逻辑复杂，业务场景经常变更），如果只是一个简单的小需求，还不如直接面向过程完成。
 *
 * @since 10:05
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        Elephant e = new Elephant();
        Fridge f = new Fridge();
        e.setEleF(f);
        e.into();
        f.open();
        e.into();
        f.close();

    }
}
// 大象类,能够自己走进冰箱
class Elephant{
    // 大象需要和冰箱交互
    private Fridge eleF;

    // 走进冰箱门
    public void into(){
        if (eleF.isState()){
            System.out.println("门开了,我进去了,快关门!");
            return;
        }
        System.out.println("门还没开,赶紧开门,我要进去!");
    }

    public void setEleF(Fridge eleF) {
        this.eleF = eleF;
    }
}

// 冰箱类,可以自己开关门
class Fridge{
    // 冰箱门的状态,false表示关门,true表示开门
    private boolean state = false;

    public void open(){
        if (!state){
            state = true;
            System.out.println("冰箱门开了!");
        }
    }
    public void close(){
        if (state){
            state = false;
            System.out.println("冰箱门关了!");
        }
    }

    public boolean isState() {
        return state;
    }
}
